perm filename TLKEF2.FAI[AL,HE]1 blob sn#293150 filedate 1977-06-29 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE TLKEF2
C00006 00003	START OF EXECUTABLE CODE
C00009 00004		[CONTINUATION OF "TLKEF2"]
C00013 00005		[LOCAL STORAGE AREA]
C00016 ENDMK
C⊗;
TITLE TLKEF2
INTERNAL TLKEF2

;"TLKEF2" IS A SAIL CALLABLE PROCEDURE FOR SENDING A COMMAND INSTRUCTION
;BLOCK FROM THE PDP10 TO THE PDP11.  THE INSTRUCTION BLOCK CONTAINS THE
;INFORMATION NECESSARY TO DRIVE ONE ARM JOINT.  IN ADDITION, DIAGNOSTIC
;DATA IS COLLECTED FROM THE ELF AND RETURNED TO THE CALLING PROGRAM
;BEFORE EXITING.  A SAMPLE SAIL CALL FOLLOWS:
;
;	STAT←TLKEF2(ARM,JOINT,DURA,ANGLE1,ANGLE2,MASTER,DATA);
;WHERE
;	STAT  = 0 → MOVEMENT INITIATED, 1 INDICATES FAILURE, <0 JT STATUS WD
;	ARM   = 0 FOR YELLOW ARM, 1 FOR BLUE
;	JOINT = 0 TO 6
;	DURA  = 1 TO 32000, DURATION OF MOTOR DRIVE IN MILLISECONDS
;	MASTER= CHECK WORD TO ELF TO INSURE THIS IS A LEGAL INSTRUCTION
;	DATA  = ARRAY TO RETURN DYNAMIC RESPONSE DATA
;	ANGLE = CHANGE IN JT ANGLE CONVERTED TO TWO WDS OF PDP11 F.P.
;
;TLKELF EXPECTS THE "ARM" VALUE IN THE ELF TO BE NEGATIVE INDICATING THAT THE
;ELF IS PREPARED TO RECEIVE A COMMAND BLOCK.  IF "ARM" IS NOT NEGATIVE AN ERROR
;MESSAGE IS TYPED AND TLKELF EXITS TO THE CALLING PROGRAM.  AFTER PASSING THE
;CONTROL BLOCK, TLKELF GOES INTO A WAIT LOOP LOOKING FOR "ARM" TO GO NEGATIVE
;IN THE ELF INDICATING THAT THE ARM MOTION IS COMPLETED.  IF TLKELF IS IN A WAIT
;LOOP FOR OVER 60 SECONDS, AN ERROR MESSAGE IS TYPED.  IF THE "ELF" COMPLETES
;A MOTION SUCCESSFULLY, THE ARRAY DATA IS FILLED WITH DIAGNOSTIC DATA FROM THE
;ELF "DBUF" AREA.  AFTER EXECUTION OF TLKEF2, THE ELF IS LEFT IN A WAIT LOOP
;LOOKING FOR ANOTHER COMMAND BLOCK.

;DEFINITIONS

P←17		;PUSH STACK REGISTER
CMDADD←44000	;COMMAND BUFFER (WORD) ADDRESS IN ELF
CMDSTT←44006	;JOINT STATUS WORD AFTER EXECUTAON OF FUNCTION
DBUFL←=3601	;NUMBER OF WORDS IN DIAGNOSTIC DATA BUFFER
;START OF EXECUTABLE CODE

TLKEF2:	MOVEM	16,HOLD+14	;SAVE THE REGISTERS
	MOVE	16,[XWD 2,HOLD]
	BLT	16,HOLD+13
	MOVE	1,P		;GET THE ADDRESS OF THE STACK
	SUBI	1,=7 		;GET THE ADDRESS OF "ARM" NUMBER
	HRLZ	1,1		;PREPARE TO BLT INTO LOCAL ARRAY
	HRRI	1,CMDARR	;STORE ARGUMENTS IN CMDARR
	BLT	1,CMDARR+6 	;TRANSFER ARGUMENTS
	SOS	2,DATA		;DECREMENT ARRAY POINTER
	HRLI	2,-DBUFL 	;SET POINTER TO TRANSFER DIAGNOSTIC DATA
	MOVEM	2,INLST
	IOPUSH	1,		;CALLER MIGHT WANT THIS CHANNEL
	JRST	[   OUTSTR CM0	;IOPDLOV MESSAGE
		    JRST   ERR  ]
	INIT	1,17  		;INITIALIZE THE ELF
	SIXBIT	/ELF/
	0
	JRST	[   OUTSTR CM1		;ERROR RETURN
ERR:		    MOVEI  1,1    	;RETURN ERROR VALUE
		    JRST   TLKDNE  ]
	GETSTS	1,1		;GET THE ELF STATUS WORD
	TRNE	1,777700	;CHECK FOR ERROR CONDITION
	JRST	[   OUTSTR CM2		;INDICATE STATUS ERROR
		    JRST   ERR    ]
	
;CHECK IF ELF IS READY TO RECEIVE A COMMAND BLOCK

	MTAPE	1,ARMADD	;GET THE VALUE OF "ARM" WORD IN ELF
	JRST	[   OUTSTR CM3		;ERROR RETURN
		    JRST   ERR  ]
	MOVE	2,ARM		;LOAD VALUE INTO REGISTER
	JUMPGE	2,[ OUTSTR CM4	;ELF NOT READY FOR COMMAND IF ARM GE 0
		    JRST   ERR  ]

;SEND COMMAND BLOCK TO "ELF"

	USETO	1,CMDMDE	;SET UP OUTPUT OF COMMAND BLOCK
	OUT	1,OUTLST	;SEND THE COMMAND LIST TO THE ELF
	JRST	.+2		;NORMAL RETURN
	JRST	[   OUTSTR CM5		;ERROR RETURN
		    JRST   ERR  ]

;GO INTO WAIT LOOP UNTIL TASK DONE

	MOVEI	=20		;SET WAIT LOOP COUNT
	MOVEM	CNT
SLEP:	MOVEI	2,1		;SET PROGRAM TO SLEEP FOR 1 SECOND
     	SLEEP	2,
;	[CONTINUATION OF "TLKEF2"]

	MTAPE	1,ARMADD	;GET THE VALUE OF "ARM" WORD IN ELF
	JRST	[   OUTSTR COM6		;ERROR RETURN
		    JRST   ERR  ]
	MOVN	1,ARM		;LOAD VALUE INTO REGISTER
	JUMPG 	1,DVEDNE	;IF "ARM" VALUE NEGATIVE, BRANCH, MOTOR DRIVE DONE
	SOSE	CNT		;SKIP IF ELF TAKES TOO MUCH TIME
	JRST	SLEP		;ELSE GO SLEEP AGAIN
	OUTSTR  COM7		;TELL OPERATOR, ELF TOOK TOO MUCH TIME
	JRST    ERR  
	
;MOTOR DRIVE FUNCTION COMPLETED. COLLECT RESPONSE DATA

DVEDNE:	CAIN	1,2		;CHECK IF ERROR CODE TWO RETURNED
	JRST	[   OUTSTR COM9		;TYPE MASTER NUMBER ERROR
		    JRST   ERR  ]
	OR	1,[400004,,400000]	;ADD TRANSFER MODE BITS
	MOVEM	1,DYNA
     	USETI	1,DYNA  	;SET UP INPUT OF D.R. DATA BLOCKS
     	IN	1,INLST		;READ IN A BLOCK OF DATA
	JRST	.+2		;NORMAL RETURN
	JRST	[   OUTSTR COM8		;ERROR RETURN
		    JRST   ERR  ]

;READ IN THE JOINT STATUS WORD

	MTAPE	1,STTADD	;GET THE VALUE OF "STATUS" WORD IN ELF
	JRST	[   OUTSTR COM10	;ERROR RETURN
		    JRST   ERR  ]
	MOVN	1,ARMSTT		;RETURN THE ARM STATUS

;RETURN TO CALLING PROGRAM

TLKDNE:	IOPOP	1,		;RELEASE THE ELF & RESTORE CHANNEL 1
	JFCL			;JUST CANNOT HAPPEN
       	MOVE 	16,[XWD HOLD,2]	;RESTORE THE REGISTERS
	BLT	16,15
	MOVE	16,HOLD+14
	SUB	P,[10(10)]	;POP ARGUMENTS OFF STACK
	JRST	@10(P)		;RETURN


;END OF "TLKEF2"
;	[LOCAL STORAGE AREA]

CNT:	0
HOLD:	BLOCK	15
INBUF:	BLOCK	3

;COMMAND DATA BLOCK

CMDARR:	0		;YELLOW OR BLUE ARM
	0		;JOINT
	0		;MOTION DURATION
	0		;CHANGE IN JOINT ANGLE
	0
	0		;MASTER NUMBER
DATA:	0		;ADDRESS OF DYNAMIC RESPONSE DATA ARRAY

;I/O DATA AREAS

ARMADD:	002004,,CMDADD	;MODE AND ADDRESS FOR COMMAND OUTPUT STRING
ARM:	0		;VALUE OF "ARM" LOCATION IN ELF

STTADD:	002004,,CMDSTT	;MODE AND ADDRESS FOR ARM STATUS WORD IN ELF
ARMSTT:	0

DYNA:	400004,,400000	;MODE AND ADDRESS FOR "IN" OF DYNAMIC RESPONSE DATA

CMDMDE:	400004,,400000+CMDADD	;MODE AND ADDRESS FOR COMMAND OUTPUT STRING

OUTLST:	IOWD 6,CMDARR	;OUT COMMAND LIST
	0

INLST:	IOWD DBUFL,INBUF	;DYNAMIC RESPONSE INPUT LIST
	0

;OUTPUT STRINGS

CM0:	ASCIZ/IOPDLOV WHEN TRY TO SAVE CHANNEL 1 FOR "ELF"
/
CM1:	ASCIZ/CANNOT INIT "ELF"
/
CM2:	ASCIZ/"ELF" STATUS WORD INDICATES ERROR CONDITION
/
CM3:	ASCIZ/READING OF "ELF" READY FLAG FAILED
/
CM4:	ASCIZ/"ELF" NOT READY FOR ARM COMMAND
/
CM5:	ASCIZ/BAD TRANSFER OF COMMAND LIST TO "ELF"
/
COM6:	ASCIZ/BAD READ FROM "ELF" DURING MOTOR DRIVE WAIT LOOP
/
COM7:	ASCIZ/MOTOR DRIVE TOOK TOO LONG TO EXECUTE
/
COM8:	ASCIZ/BAD READ FROM "ELF" DURING DIAGNOSTICS DATA TRANSFER
/
COM9:	ASCIZ/WRONG MASTER NUMBER SENT TO "ELF"
/
COM10:	ASCIZ/BAD READ FROM "ELF" DURING JOINT STATUS WORD TRANSFER
/

END